package com.ByteDance.config;

import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.Collections;

@ComponentScan(basePackages = "com.ByteDance.controller")
@Configuration   //要被配置到SpringBoot里面去---标注当前为配置类
@EnableSwagger2  //开启swagger2
public class swaggerConfig {
    @Bean
    public Docket createRestApi() {

        return new Docket(DocumentationType.SWAGGER_2)
                //表示使用SWAGGER_2规范生成文档
                .apiInfo(apiInfo())
                //在 apiInfo() 方法中，设置了 API 文档的详细信息，包括标题、描述、联系方式、许可证等。
                .select()
                //select() 方法开始配置扫描的包和路径
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                //方法用于指定扫描哪些包/类/方法生成 API 文档。这里使用了 ApiOperation 注解来标记需要生成文档的 API 方法。
                .paths(PathSelectors.regex("(?!/error.*).*"))
                //方法用于指定生成 API 文档的路径规则。这里使用了正则表达式，排除了以 “/error” 开头的路径。
                .build()
                .globalOperationParameters(
                        Collections.singletonList(
                                new ParameterBuilder()
                                        .name("token")
                                        .description("Token")
                                        .modelRef(new ModelRef("string"))
                                        .parameterType("header")
                                        .required(false)
                                        .build()
                        )
                );
            /* 当配置全局请求参数时，我们使用ParameterBuilder来创建一个Parameter对象，并设置该参数的各个属性。下面是对每个属性的解释：
            name("token"): 设置参数的名称。在示例中，参数名为"token"。
            description("Token"): 设置参数的描述。在示例中，参数描述为"Token"。
            modelRef(new ModelRef("string")): 设置参数的数据类型。在示例中，参数类型为字符串。ModelRef用于指定参数的数据模型，这里我们使用了字符串类型的模型。
            parameterType("header"): 设置参数的位置。在示例中，参数位置为header。其他可能的位置有"query"（查询参数）和"path"（路径参数）等。
            required(true): 指定参数是否为必需的。在示例中，参数为必需，即必须提供该参数。
            build(): 构建Parameter对象。  */

            }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("极简版抖音接口文档")//标题
                .description("用户管理接口文档")//描述
                .termsOfServiceUrl("http://springfox.io")
                .contact(new Contact("朱哥", "https://www.apifox.cn/apidoc/shared-09d88f32-0b6c-4157-9d07-a36d32d7a75c/api-50707522", "1399671339@qq.com"))//联系方式
                .license("Apache License Version 2.0")//许可证
                .licenseUrl("https://github.com/springfox/springfox/blob/master/LICENSE")
                .version("3.0")
                .build();
    }
}
